package com.cjm.algorithm.quick;

import com.cjm.algorithm.HelpUtils;

public class QuickSort {
    public static void sort(int[] arr) {
        sort(arr, 0, arr.length - 1);
    }
    public static void sort(int[] arr, int left, int right) {
        if (left >= right) {
            return;
        }
        int p = partition(arr, left, right);
        sort(arr, left, p - 1);
        sort(arr, p+1, right);
    }

    private static int partition(int[] arr, int left, int right) {
        // 拿出左边的元素
        int flag = arr[left];
        // 索引记录下来
        int j = left;
        // 从标记元素的右侧元素开始
        for(int i = left + 1; i <= right;i++) {
            // 如果是大于的话, 这个是不用动的, 因为, 定义如此, 在j的左侧是小于flag的值, 在j的右侧是大于flag的值
            // 那么如果当前位置的值大于flag的话, j是不用移动的
            if (arr[i] < flag) {
                j ++;
                HelpUtils.swap(arr, j, i);
            }
        }
        HelpUtils.swap(arr, left, j);
        return j;
    }

    public static void main(String[] args) {
        int[] arr = new int[] {4, 6, 2, 8, 4, 1, 5, 7, 96};
        sort(arr);
        for (int i : arr) {
            System.err.println(i);
        }
    }
}
